perm filename PREDIC.SAI[SYS,HE] blob sn#021184 filedate 1973-01-23 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00018 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00005 00002	BEGIN "PREDICTOR"
 00006 00003	α DEFINITIONS, MACROS
 00008 00004	α VARIABLE DECLARATIONS
 00009 00005	α FUNCTION DECLARATIONS
 00013 00006	α	PRINTNAME, CVLB, CROSS, DOT, HOMO_XFRM
 00015 00007	α	DISKIN
 00018 00008	α	DISKOUT
 00020 00009	α	CBFEV
 00023 00010	α	PINIT
 00026 00011	α	INITCAM
 00027 00012	α	SETCAM
 00029 00013	α	INST_INIT
 00033 00014	α	COPYB
 00036 00015	α	HECALL
 00038 00016	α	DPYFRAME,DPYSTAT,DPYL,DISPLAY
 00040 00017	α	HIDEN,PREDICT
 00042 00018	α	***	START OF EXECUTION	***
 00044 ENDMK
⊗;
BEGIN "PREDICTOR"

REQUIRE		500			NEW_ITEMS;
REQUIRE					PNAMES;
REQUIRE		"PREAMB.SAI[SYS,HE]"	SOURCE_FILE;
REQUIRE		"PREDIC.AUX[SYS,HE]"	SOURCE_FILE;
REQUIRE		"SAITRG[SYS,BGB]"	SOURCE_FILE;
REQUIRE		"DPYIII.AUX[H,RPO]"	SOURCE_FILE;
REQUIRE		"PRED0.SAI[SYS,HE]"	LOAD_MODULE;

α DEFINITIONS, MACROS;

DEFINE	INCREM(X)=<X←X+1>,
	DECREM(X)=<X←X-1>,
	#ALBODY=<6>,
	ITG=<INTEGER>,
	mm=<39.36@-3>,

	APOG=<11>,
	BPOG=<12>,
	T1POG=<13>,
	T2POG=<14>,
	SPOG=<15>,
XSUBR=<EXTERNAL SIMPLE PROCEDURE>,
XISUBR=<EXTERNAL INTEGER SIMPLE PROCEDURE>,
XRSUBR=<EXTERNAL REAL SIMPLE PROCEDURE>,
XSSUBR=<EXTERNAL STRING SIMPLE PROCEDURE>,

SUBR=<SIMPLE PROCEDURE>,
ISUBR=<INTEGER SIMPLE PROCEDURE>,
RSUBR=<REAL SIMPLE PROCEDURE>,
SSUBR=<STRING SIMPLE PROCEDURE>,

#PDX=<4>,	#PDY=<5>,	#FOCAL=<6>,
#LDX=<1>,	#LDY=<2>,	#LDZ=<3>,
#XSCALE=<7>,	#YSCALE=<8>,	#ZSCALE=<9>;

α ...#PROTO IS THE INITIAL PROTOTYPE WPTR,
  ...#INST IS THE INITIAL INSTANCE WPTR;
DEFINE	#PROTO=<0>,#INST=<10>;

α RING POSITION NUMBERS; DEFINE

#QRING = <-1>,
#LDX = <1>,	#XL=<1>,
#LDY = <2>,	#XH=<2>,
#LDZ = <3>,	#YL=<3>,
#PDX = <4>,	#YH=<4>,
#PDY = <5>,
#FOCAL = <6>,	#ALBODY=<6>,
#OX = <5>,
#OY = <6>,
#DX = <7>,	#MAGX = <7>,
#DY = <8>,	#MAGY = <8>,
#CAMERA =<-4>,
#LOCOR = <-3>,
#XSCALE = <7>,
#YSCALE = <8>,
#ZSCALE = <9>,
#SOX = <-2>,
#SOY = <-1>;

α VARIABLE DECLARATIONS;

α LOCALS;
ITEM BGB;
BOOLEAN IFLAG;
SAFE REAL ARRAY SIZE7[1:7],LOCARY[-3:8];
ITEMVAR PROTO;
INTEGER MESS1,LOCPTR;

α INTERNALS;
INTERNAL INTEGER
	WPTR,PWORLD,
	LDX,LDY,LDZ,
	VERNX,VERNY,
	CAMERA,SWINDO,OWINDO,IIIDPY,LOC,
	SXL,SXH,SYL,SYH,SCX,SCY,SDX,SDY,
	DXL,DXH,DYL,DYH,DCX,DCY,DDX,DDY;

INTERNAL REAL
	PDX,PDY,FOCAL,
	DA,SA,
	OXL,OXH,OYL,OYH,OX,OY,MAGX,MAGY,SOX,SOY;

INTERNAL SAFE INTEGER ARRAY
	ENTITY	[1:50],
	PART#	[1:50],
	COPAR#	[1:50];

INTERNAL SAFE STRING ARRAY
	NAME	[1:50];
INTERNAL SAFE INTEGER ARRAY DPYAA[1:200];

α EXTERNALS;
EXTERNAL INTEGER WORLD;

α FUNCTION DECLARATIONS;

α RING OPERATIONS;
XSUBR	RINGIN(ITG E,Q,N);
XSUBR	RINGO(ITG E,N);

α DYNAMIC FREE STORAGE;
XISUBR	GETBLK(ITG SIZE);
XSUBR	RELBLK(ITG ADDR);

α MNEMONICS;
ISUBR	CAR(ITG Q);	START_CODE HLRZ 1,@Q END;
ISUBR	CDR(ITG Q);	START_CODE HRRZ 1,@Q END;
SUBR	DAC(ITG N,Q);	START_CODE MOVE N; MOVEM @Q END;
SUBR	DACR(REAL X;ITG Q);	START_CODE MOVE X;MOVEM @Q END;
SUBR	DAP(ITG N,Q);	START_CODE MOVE N;HRRM @Q END;
SUBR	DIP(ITG N,Q);	START_CODE MOVE N;HRLM @Q END;
ISUBR	LAC(ITG Q);	START_CODE MOVE 1,@Q END;
RSUBR	LACR(ITG Q);	START_CODE MOVE 1,@Q END;

α ENTITY TYPES;
BSUBR	BTYPE(ITG X);	RETURN( (CAR(X) LAND 1) ≠ 0) ;

α BFEV MAKE & KILL OPERATIONS;
XISUBR	MKB(ITG W);
XISUBR	MKF(ITG W);
XISUBR	MKE(ITG W);
XISUBR	MKV(ITG W);

α FETCH OPERATIONS;
XISUBR	COPART	(ITG X);
XISUBR	ECNT	(ITG X);
XISUBR	FCNT	(ITG X);
XISUBR	LOCOR	(ITG X);
XISUBR	NBODY	(ITG X);
XISUBR	NCNT	(ITG X);
XISUBR	NCW	(ITG X);
XISUBR	NCCW	(ITG X);
XISUBR	NFACE	(ITG X);
XISUBR	NED	(ITG X);
XISUBR	NVT	(ITG X);
XISUBR	PART	(ITG X);
XISUBR	PCW	(ITG X);
XISUBR	PCCW	(ITG X);
XISUBR	PED	(ITG X);
XISUBR	PFACE	(ITG X);
XISUBR	PNAME	(ITG X);
XISUBR	PVT	(ITG X);
XISUBR	SERIAL	(ITG X);
XISUBR	VCNT	(ITG X);
XISUBR	X1DC	(ITG E);
XISUBR	Y1DC	(ITG E);
XISUBR	X2DC	(ITG E);
XISUBR	Y2DC	(ITG E);


α STORE LINK INTO NODE OPERATIONS;
XISUBR	NCW..	(ITG Q,E);
XISUBR	NCCW..	(ITG Q,E);
XISUBR	NCNT.	(ITG V,Q);
XISUBR	NED.	(ITG Q,E);
XISUBR	NFACE.	(ITG Q,E);
XISUBR	NVT.	(ITG Q,E);
XISUBR	PCW..	(ITG Q,E);
XISUBR	PCCW..	(ITG Q,E);
XISUBR	PED.	(ITG E,Q);
XISUBR	PFACE.	(ITG Q,E);
XISUBR	PNAME.	(ITG W,B);
XISUBR	PVT.	(ITG Q,E);

α WING MAKE LINK OPERATION;
XISUBR	NCCW.	(ITG Q,E);
XISUBR	NCW.	(ITG Q,E);
XISUBR	PCCW.	(ITG Q,E);
XISUBR	PCW.	(ITG Q,E);

α FETCH DATA FROM NODE;
XRSUBR XWC(ITG E);
XRSUBR YWC(ITG E);
XRSUBR ZWC(ITG E);
XRSUBR XPP(ITG E);
XRSUBR YPP(ITG E);
XRSUBR ZPP(ITG E);

α EXTERNAL PROCEDURES;
EXTERNAL PROCEDURE OCCULT;

α IMAGE SYNTHESIS OPERATIONS;
XISUBR	MKLOCOR;
XSUBR	PROJECTOR(ITG CAMERA,ALBODY);
XSUBR	EMARKALL(ITG ALBODY);
XSUBR	FMARK(ITG ALBODY);
XSUBR	EMARK(ITG ALBODY);
XISUBR	CLIPER(ITG WINDOW,ALBODY);
XSUBR	KLJOTS;
XSUBR	KLJUTS;
XSUBR	KLTEMP;
α	PRINTNAME, CVLB, CROSS, DOT, HOMO_XFRM;

SSUBR PRINTNAME(ITEMVAR X);
BEGIN "PNAME"
STRING NAME;
INTEGER I;
NAME←CVIS(X,I);
IF I
THEN IF CVN(X)>1024
     THEN NAME←"G"&CVOS(CVN(X))
     ELSE NAME←"L"&CVOS(CVN(X));
RETURN(NAME);
END "PNAME";

ISUBR CVLB(ITEMVAR X);
BEGIN "CVLB"
INTEGER ITEMVAR Y;
∀ Y|BGB⊗X≡Y DO DONE;
RETURN(∂(Y));
END "CVLB";

SUBR CROSS(REFERENCE SAFE REAL ARRAY A,B,CP);
BEGIN "CROSS"
	CP[1]←A[2]*B[3]-A[3]*B[2];
	CP[2]←A[3]*B[1]-A[1]*B[3];
	CP[3]←A[1]*B[2]-A[2]*B[1];
	END "CROSS";

RSUBR DOT(SAFE REAL ARRAY V1,V2);
BEGIN "DOT"
	REAL DP;INTEGER I;
	DP←0.0;
	FOR I←1 THRU 4 DO DP←DP+V1[I]*V2[I];
	RETURN(DP);
	END "DOT";

PROCEDURE HOMO_XFRM(SAFE REAL ARRAY P,T);
BEGIN "HOMOXFRM"
SAFE REAL ARRAY TEMP[1:4];
INTEGER I,J;
FOR I←1 STEP 1 UNTIL 4 DO
BEGIN "H1"
	TEMP[I]←0.0;
	FOR J←1 STEP 1 UNTIL 4 DO
		TEMP[I]←TEMP[I]+T[I,J]*P[J];
	END "H1";
FOR J←1 STEP 1 UNTIL 4 DO P[J]←TEMP[J]/TEMP[4];
END "HOMOXFRM";
α	DISKIN;

PROCEDURE DISKIN;
BEGIN "DISKIN"
SAFE REAL ARRAY ITEMVAR GI,GC;
ITEMVAR GP;
SAFE REAL ARRAY XF[1:10,1:3],FOURBY4[1:4,1:4];
STRING FILENAME,ANS,STR,PNAME;
INTEGER I,J,K,BREAK,EOF,FLAG,BODYNUM;
DEFINE	INFILE=<1>, LYNE=<1>, PARE=<2>, ID=<3>;
DEFINE	NUMBER=<BODYNUM>, OF=<←>, INSTANCES=<INTIN(INFILE);>,
	GETPNAME=<DO ⊂  NEXTLINE TOKEN ⊃ UNTIL LENGTH(PNAME);>,
	NEXTLINE=<STR←INPUT(INFILE,LYNE);>,
	TOKEN=<	PNAME←SCAN(STR,PARE,BREAK);
		PNAME←SCAN(STR,ID,BREAK);>,
	PROTOTYPEi=<NEXTLINE
		FOR I←1 STEP 1 UNTIL BODYNUM DO
		BEGIN "ILOOP"
	GETPNAME
	GP←CVSI(PNAME,FLAG);
	IF FLAG
	THEN ⊂ TYPE "CVSI LOSSAGE" EOM; CALL(0,"EXIT"); ⊃; >,
	BODYi=<GI←$ NEW(FOURBY4);
		$ MAKE INSTANCE⊗GP≡GI;>,
	TRANSFORMi=< FOR J←1 STEP 1 UNTIL 4 DO
		FOR K←1 STEP 1 UNTIL 4 DO
		$ ∂(GI)[J,K]←REALIN(INFILE);
		END "ILOOP";	>,
	CAMERA=<GC←$ NEW(XF);
		$ MAKE XFORM⊗SCENE≡GC;>,
	TRANSFORM=< FOR J←1 STEP 1 UNTIL 10 DO
		FOR K←1 STEP 1 UNTIL 3 DO
		$ ∂(GC)[J,K]←REALIN(INFILE);>;


SETBREAK(LYNE,'15,'12,"INS");
SETBREAK(PARE,"CRWG","","INR");
SETBREAK(ID," "&TAB,"","INR");
OPEN(INFILE,"DSK",0,2,0,120,BREAK,EOF);
DO ⊂	TYPE "FILE NAME (.REC assumed) = " EOS;
	FILENAME←INCHWL&".REC";
	LOOKUP(INFILE,FILENAME,FLAG);
	IF FLAG
	THEN TYPE "FILE "&FILENAME&" NOT FOUND!" EOM;
	⊃ UNTIL ¬FLAG;

α FILE FORMAT;

NUMBER OF INSTANCES

PROTOTYPEi	BODYi
TRANSFORMi

CAMERA TRANSFORM

α EOF.;

RELEASE(INFILE);
END "DISKIN";

α	DISKOUT;

INTERNAL PROCEDURE DISKOUT;
BEGIN "DISKOUT"
SAFE REAL ARRAY ITEMVAR GP;
ITEMVAR GL;
SET LSET;
INTEGER EOF,BREAK,FLAG,LINENUM;
STRING ANS,FILENAME;
DEFINE	PRINT =<OUT(OUTFILE,>,
	SEPARATE=<OUT(OUTFILE,↓&↓&↓&↓);>,
	OUTFILE=<1>,
	!=<&↓);>, CRLF=<OUT(OUTFILE,↓);>;

TYPE "WOULD YOU LIKE AN OUTPUT FILE?" EOM;
IF ANS←INCHWL="Y" ∨ ans="y"
THEN BEGIN "OUT"
	OPEN(OUTFILE,"DSK",0,0,2,120,BREAK,EOF);
	DO ⊂
	TYPE "FILE NAME (.PRE ASSUMED) = " EOS;
	FILENAME←INCHWL&".PRE";
	ENTER(OUTFILE,FILENAME,FLAG);
	IF FLAG
	THEN TYPE "ENTER FAILED !" EOM;
	⊃ UNTIL ¬FLAG;

LSET←($ VISIBLE⊗SCENE);
LINENUM←LENGTH(LSET);
PRINT "RESULTS OF PREDICTOR" !
SEPARATE
PRINT "THERE ARE "&CVS(LINENUM)&" VISIBLE LINES." !
SEPARATE
∀ GL|$ VISIBLE⊗SCENE≡GL DO
BEGIN "V LINE"
	PRINT TAB&"LINE: "&PRINTNAME(GL) !
	∀ GP|$ ENDPT⊗GL≡GP DO
	PRINT TAB&TAB&"ENDPT: "&PRINTNAME(GP)&TAB&
		CVG($ ∂(GP)[1])&CVG($ ∂(GP)[2]) !
	CRLF
	END "V LINE";
SEPARATE
PRINT "EOF." !

RELEASE(OUTFILE);

END "OUT";
END "DISKOUT";

α	CBFEV;

PROCEDURE CBFEV(INTEGER B;ITEMVAR P);
BEGIN "CBFEV"
INTEGER		I,Q,E#,PF#,NF#,
		PV#,NV#,PCCW#,PCW#,NCCW#,NCW#;
ITEMVAR		E,NF,PCWE,PCCWE,NCWE,NCCWE;
SAFE REAL ARRAY ITEMVAR
		PV,NV,OV,PF;
SET		FSET,VSET,PFSET,NFSET;
SAFE REAL ARRAY
		VE,VPCWE,CP[1:4];

∀ E|$ EDGE⊗P≡E DO
⊂ "EDGE"
	E#←CVLB(E);
	FSET←$ BOUNDARY`E;
	PF←LOP(FSET);	PF#←CVLB(PF);
	NF←COP(FSET);	NF#←CVLB(NF);
	VSET←$ ENDPT⊗E;
	PV←LOP(VSET);	PV#←CVLB(PV);
	NV←COP(VSET);	NV#←CVLB(NV);
	PFSET←$ BOUNDARY⊗PF-{E};
	NFSET←$ BOUNDARY⊗NF-{E};
	PCWE←COP(($ ENDPT`PV)∩PFSET);	PCW#←CVLB(PCWE);
	PCCWE←COP(($ ENDPT`NV)∩PFSET);	PCCW#←CVLB(PCCWE);
	NCWE←COP(($ ENDPT`NV)∩NFSET);	NCW#←CVLB(NCWE);
	NCCWE←COP(($ ENDPT`PV)∩NFSET);	NCCW#←CVLB(NCCWE);

	FOR I←1 THRU 4 DO VE[I]←$ ∂(PV)[I]-$ ∂(NV)[I];
	OV←COP(($ ENDPT⊗PCWE)-{PV});
	FOR I←1 THRU 4 DO VPCWE[I]←$ ∂(OV)[I]-$ ∂(PV)[I];

	CROSS(VE,VPCWE,CP);
	IF DOT(CP,$ ∂(PF)) > 0
	THEN ⊂	PF↔NF;		PF#↔NF#;
		NCCWE↔PCWE;	NCCW#↔PCW#;
		PCCWE↔NCWE;	PCCW#↔NCW# ⊃;

	PVT.(PV#,E#);
	NVT.(NV#,E#);
	PFACE.(PF#,E#);
	NFACE.(NF#,E#);
	PCW..(PCW#,E#);
	PCCW..(PCCW#,E#);
	NCW..(NCW#,E#);
	NCCW..(NCCW#,E#);

	Q←PFACE(E#);
	PED.(E#,Q);		NCNT.(NCNT(Q)+1,Q);
	Q←NFACE(E#);
	PED.(E#,Q);		NCNT.(NCNT(Q)+1,Q);

	PED.(E#,NV#);
	PED.(E#,PV#) ⊃ "EDGE";

	END "CBFEV";

α	PINIT;

SUBR PINIT;
BEGIN "PINIT"
ITEMVAR F,E,PROTO;
SAFE REAL ARRAY ITEMVAR V;
INTEGER Q,PB,CNT,I;

TYPE "PROTOTYPE INITIALIZATION IN PROGRESS" EOM;

α prototype world initialization;

WPTR←#PROTO;
WORLD←GETBLK(5+10)+4;
α RINGO(WORLD,#ALBODY) ... REPLACE WITH DIP AND DAP:;
α RINGO(WORLD,#CAMERA) ... REPLACE WITH DIP AND DAP:;
DIP(WORLD,WORLD+#ALBODY);
DAP(WORLD,WORLD+#ALBODY);
DIP(WORLD,WORLD+#CAMERA);
DAP(WORLD,WORLD+#CAMERA);
LOC←MKLOCOR;
DAP(LOC,WORLD-2);
DAP(-WORLD,WORLD-3);
DIP(-WORLD,WORLD-3);

α create a BGB data structure for prototypes in the upper segment;

α REMOVE THE NEW PROTOTYPES FROM PROTOTYPES...;

PROTOTYPES←PROTOTYPES - {SLAB,WEDGE,BOX,LBEAM,RHOMBOID};

∀ PROTO|PROTOεPROTOTYPES DO
BEGIN	"PI"
	TYPE TAB&"INITIALIZE PROTOTYPE "&PRINTNAME(PROTO) EOM;
	PB←MKB(WORLD);
	MAKE BGB⊗PROTO≡NEW(PB);
α	RINGIN(PB,WORLD,#ALBODY)...LET THEM BE INVISIBLE ! ;
	INCREM(WPTR); α ...REDUNDENT, BUT WHY NOT;
	ENTITY[WPTR]←PB;
	PNAME.(WPTR,PB);
	NAME[WPTR]←PRINTNAME(PROTO);
	CNT←0;
	∀ F|$ FACE⊗PROTO≡F DO
	⊂ Q←MKF(PB);INCREM(CNT); MAKE BGB⊗F≡NEW(Q) ⊃;
	CNT←0;
	∀ E|$ EDGE⊗PROTO≡E DO
	⊂ Q←MKE(PB);INCREM(CNT); MAKE BGB⊗E≡NEW(Q) ⊃;
	CNT←0;
	∀ V|$ VERTEX⊗PROTO≡V DO
	⊂ Q←MKV(PB); FOR I←1 THRU 3 DO DACR($ ∂(V)[I],Q-4+I);
	  INCREM(CNT); MAKE BGB⊗V≡NEW(Q) ⊃;
	CBFEV(PB,PROTO);
α	PART#[PNAME(PB)]←-PNAME(-PART(PB));
α	COPAR#[PNAME(PB)]←-PNAME(-COPART(PB));
	END "PI";

END "PINIT";

α	INITCAM;

SUBR INITCAM;
BEGIN "INITCAM"
	DACR(PDX,CAMERA+#PDX);
	DACR(PDY,CAMERA+#PDY);
	DACR(FOCAL,CAMERA+#FOCAL);

	DAC(LDX,CAMERA+#LDX);
	DAC(LDY,CAMERA+#LDY);
	DAC(LDZ,CAMERA+#LDZ);

	DACR(-FOCAL*LDX/PDX,CAMERA+#XSCALE);
	DACR(-FOCAL*LDY/PDY,CAMERA+#YSCALE);
	DACR( FOCAL*LDZ    ,CAMERA+#ZSCALE);
END "INITCAM";

α	SETCAM;

SUBR SETCAM;
BEGIN	"SETCAM"
	ITG CAMLOC;
	REAL X,Y,Z,PAN,TILT,F;
	REAL CP,SP,CT,ST,TMP;
	REAL IXX,IYY,IZZ,JXX,JYY,JZZ,KXX,KYY,KZZ;
	SAFE REAL ARRAY ITEMVAR XRA;

∀ XRA|$ XFORM⊗SCENE≡XRA DO DONE;
X←$ ∂(XRA)[4,1];
Y←$ ∂(XRA)[4,2];
Z←$ ∂(XRA)[4,3];
PAN←$ ∂(XRA)[9,1];
TILT←$ ∂(XRA)[9,2];
F ← IF ($ ∂(XRA)[10,2]=1) THEN 25.0 ELSE 50.0;
	FOCAL ← F *  mm;
	CAMLOC ← LOCOR(CAMERA);
	DACR(X,CAMLOC-3);
	DACR(Y,CAMLOC-2);
	DACR(Z,CAMLOC-1);
	IXX ← JYY ← KZZ ← 1;
	IYY ← IZZ ← 0;
	JXX ← JZZ ← 0;
	KXX ← KYY ← 0;
α PAN THE CAMERA ABOUT WORLD VERTICAL;
	PAN ← PAN + π/2;
	TILT ← π/2 - TILT;
	CP	←	COS(PAN);
	SP	←	SIN(PAN);
	TMP ← CP*IXX - SP*IYY; IYY ← CP*IYY + SP*IXX; IXX ← TMP;
	TMP ← CP*JXX - SP*JYY; JYY ← CP*JYY + SP*JXX; JXX ← TMP;
α TILT THE CAMERA ABOUT CAMERA HORIZONTAL;
	CT	←	COS(TILT);
	ST	←	-SIN(TILT);
	TMP ← CT*JXX - ST*KXX; KXX ← CT*KXX + ST*JXX; JXX ← TMP;
	TMP ← CT*JYY - ST*KYY; KYY ← CT*KYY + ST*JYY; JYY ← TMP;
	TMP ← CT*JZZ - ST*KZZ; KZZ ← CT*KZZ + ST*JZZ; JZZ ← TMP;

	DACR(IXX,CAMLOC+0); DACR(IYY,CAMLOC+1); DACR(IZZ,CAMLOC+2);
	DACR(JXX,CAMLOC+3); DACR(JYY,CAMLOC+4); DACR(JZZ,CAMLOC+5);
	DACR(KXX,CAMLOC+6); DACR(KYY,CAMLOC+7); DACR(KZZ,CAMLOC+8);
	INITCAM;
END	"SETCAM";
α	INST_INIT;

SUBR INST_INIT;
BEGIN "IINIT"

IFLAG←TRUE;
α ???;
START_CODE
	MOVE LOCARY;
	ADDI 3;
	MOVEM LOCPTR;
	END;

α AD HOC CAMERA RING INITIALIZATION;
TYPE "CAMERA RING INIT" EOM;
	CAMERA←GETBLK(5+10) + 4;
	LOC←MKLOCOR;
	DACR(16.0, LOC-1);
	RINGIN(CAMERA,WORLD,#CAMERA);
	RINGO(CAMERA,#QRING);
	RINGO(CAMERA,#LOCOR);
	DAP(LOC,CAMERA-2);
	RINGIN(LOC,CAMERA,#LOCOR);
α THE SIZE OF THE CAMERA:
WIDE - 345 PIXELS	2*12.7 mm
HIGH - 256 ROWS		2*9.5 mm
OF WHICH THE FOLLOWING AMOUNT ARE READ BY THE CAMERA:
WIDE -	316 PIXELS
HIGH -	240 ROWS
NOTE: PDX,PDY ARE THE PHYSICAL SIZE OF LDX,LDY - THEY
ARE THE SAME THING IN TWO DIFFERENT UNITS OF MEASURE;
	LDX←158;
	LDY←120;
	LDZ←100000;

	PDX ← 12.7*mm*LDX/345;
	PDY ← 9.5*mm*LDY/256;
	FOCAL ← 25.0*mm;

	INITCAM;

α SOURCE WINDOW;
TYPE "SOURCE WINDOW INIT" EOM;
	SWINDO←GETBLK(2+10)+1; RINGIN(SWINDO,CAMERA,#QRING);
	SXL←-LDX; SXH←LDX; SCX←0;
	SYL←-LDY; SYH←LDY; SCY←0;
	SDX←SXH-SXL; SDY←SYH-SYL;
	SA←SDX/SDY;

	DAC(SXL,SWINDO+#XL); DAC(SXH,SWINDO+#XH);
	DAC(SYL,SWINDO+#YL); DAC(SYH,SWINDO+#YH);
	DAC(SCX,SWINDO+#OX);
	DAC(SCY,SWINDO+#OY);
	DAC(SDX,SWINDO+#DX);
	DAC(SDX,SWINDO+#DX);
	DAC(SDY,SWINDO+#DY);

α III DISPLAY WINDOW FRAME;
TYPE "III DISPLAY WINDOW INIT" EOM;
	IIIDPY←GETBLK(4+10)+3;
	DDX←DDY←500; DA←1;
	DCX←250; DCY←-250;
	DXL←0; DXH←DXL+DDX;
	DYL←-500; DYH←DYL+DDY;
	DAC(DDX,IIIDPY+#DX);
	DAC(DDY,IIIDPY+#DY);
	DACR(DXL,IIIDPY+#XL); DACR(DXH,IIIDPY+#XH);
	DACR(DYL,IIIDPY+#YL); DACR(DYH,IIIDPY+#YH);

α OBJECT WINDOW;
TYPE "OBJECT WINDOW INIT" EOM;
	OWINDO←GETBLK(3+10)+2;
	DAP(OWINDO,SWINDO);
	DAP(IIIDPY,OWINDO);
α CRAM SWINDO INTO DPY FRAME OWINDO;
TYPE "CRAM" EOM;
	MAGY←MAGX←(IF SA>DA THEN DDX/SDX ELSE DDY/SDY);
	DACR(MAGX,OWINDO+#MAGX);
	DACR(MAGY,OWINDO+#MAGY);
TYPE "CROP" EOM;
	OXL←DXL;
	OXH←DXL+MAGX*SDX;
	OYL←DYL;
	OYH←DYL+MAGY*SDY;
	DACR(OXL,OWINDO+#XL); DACR(OXH,OWINDO+#XH);
	DACR(OYL,OWINDO+#YL); DACR(OYH,OWINDO+#YH);
	DACR(SOX←DCX,OWINDO+#SOX);
	DACR(SOY←DCY,OWINDO+#SOY);
α SHOW THE INITIAL DISPLAY;
TYPE "SHOW THE INITIAL DISPLAY" EOM;
	VERNX←-12; VERNY←-9;
	START_CODE PPIOT 2,-250; PPIOT 3,'3003; ⊃;

TYPE "DONE INST_INIT" EOM;
END "IINIT";
α	COPYB
copy the BGB data structure of prototype BGB body PB
for an instance and return the instance body integer;

INTEGER PROCEDURE COPYB(INTEGER PB;SAFE REAL ARRAY ITEMVAR INST);
BEGIN "COPYB"
INTEGER I,IB,#F,#E,#V,#IF,#IE,#IV,#FS,#ES,#VS,E,PF,NF,PV,NV;
SAFE REAL ARRAY
	FACES[1:FCNT(PB)],
	EDGES[1:ECNT(PB)],
	VERTS[1:VCNT(PB)];

α ...ATTACH THE INSTANCE AS A PART OF THE PROTOTYPE;
	IB←MKB(PB);
	MAKE BGB⊗INST≡NEW(IB);
	RINGIN(IB,WORLD,#ALBODY);
	INCREM(WPTR);
	ENTITY[WPTR]←IB;
α ...∀ F,E,V OF THE PROTOTYPE MKF,MKE,MKV FOR THE INSTANCE;
	#F←PB;
	#E←PB;
	#V←PB;
WHILE TRUE DO
⊂ "E LOOP"
 #E←PED(#E); IF BTYPE(#E) THEN DONE;
 #IE←MKE(IB); EDGES[SERIAL(#E)]←#IE; ⊃ "E LOOP";
WHILE TRUE DO
⊂ "F LOOP"
 #F←PFACE(#F); IF BTYPE(#F) THEN DONE;
 #IF←MKF(IB); FACES[SERIAL(#F)]←#IF;
 PED.	(EDGES[SERIAL(PED(#F))],	#IF); ⊃ "F LOOP";
WHILE TRUE DO
⊂ "V LOOP"
 #V←PVT(#V); IF BTYPE(#V) THEN DONE;
 #IV←MKV(IB); FOR I←1 THRU 3 DO DACR(LACR(#V-I),#IV-I);
 VERTS[SERIAL(#V)]←#IV;
 PED.	(EDGES[SERIAL(PED(#V))],	#IV); ⊃ "V LOOP";

α ...NOW PUT IN THE WINGS;
	#E←(PB);
WHILE TRUE DO
⊂ "COPY WINGS"
#E←PED(#E); IF BTYPE(#E) THEN DONE;
E←EDGES[SERIAL(#E)];
NFACE.	(FACES[SERIAL(NFACE(#E))],	E);
PFACE.	(FACES[SERIAL(PFACE(#E))],	E);
NVT.	(VERTS[SERIAL(NVT(#E))],	E);
PVT.	(VERTS[SERIAL(PVT(#E))],	E);
NCW..	(EDGES[SERIAL(NCW(#E))],	E);
PCW..	(EDGES[SERIAL(PCW(#E))],	E);
NCCW..	(EDGES[SERIAL(NCCW(#E))],	E);
PCCW..	(EDGES[SERIAL(PCCW(#E))],	E) ⊃ "COPY WINGS";
RETURN(IB);

END "COPYB";

α	HECALL;

PROCEDURE HECALL;
BEGIN "HECALL"
SAFE REAL ARRAY ITEMVAR INST,B,GI,PROTO;
INTEGER I,#IB,#F,#V,#E;
SAFE REAL ARRAY T[1:4];
DEFINE	X=<T[1]>,Y=<T[2]>,Z=<T[3]>,W=<T[4]>;

TYPE "HECALL - ENTERED" EOM;

α first initialize an instance world, including camera;
IF ¬IFLAG
THEN INST_INIT;

α now for each instance, make a copy of the BGB prototype
data structure, with a LOCOR and the vertices updated to the
instance position;

WPTR←#INST;
I←0;
∀ GI,PROTO|$ INSTANCE⊗PROTO≡GI DO
BEGIN "GETBODY"
	I←I+1;
α	#B←ENTITY[I];
	#IB←COPYB(CVLB(PROTO),GI);
α ∀ V| $ BV⊗GI≡V DO...;
	#V←#IB;
WHILE TRUE DO
BEGIN "BODY LOOP"
	#V←PVT(#V);
	IF BTYPE(#V) THEN DONE;

	X←XWC(#V);
	Y←YWC(#V);
	Z←ZWC(#V);
	W←1.0;
α TYPE "CALL TO HOMO_XFRM" EOM;
	HOMO_XFRM(T,$ ∂(GI));
α TYPE "AFTER TO HOMO_XFRM" EOM;
	DACR(X,#V-3);
	DACR(Y,#V-2);
	DACR(Z,#V-1);
	END "BODY LOOP";
	END "GETBODY";
TYPE "DONE" EOM;
END "HECALL";
α	DPYFRAME,DPYSTAT,DPYL,DISPLAY;

SUBR DPYFRAME(ITG W);
BEGIN "DFRAME"
ITG XL,XH,YL,YH;
XL←LACR(W+#XL);	XH←LACR(W+#XH);
YL←LACR(W+#YL);	YH←LACR(W+#YH);
AIVECT(XL,YL); AVECT(XH,YL);
AVECT(XH,YH); AVECT(XL,YH); AVECT(XL,YL);
END "DFRAME";

SUBR DPYSTAT;
⊂ "DPYSTAT" DPYSET(DPYAA);DPYBIG(2);
AIVECT(LACR(IIIDPY+#XL)+5,LACR(IIIDPY+#YH)-25);
DPYSST("PREDICTOR"); DPYFRAME(IIIDPY); DPYFRAME(OWINDO);
DPYOUT(SPOG) ⊃ "DPYSTAT";

PROCEDURE DPYL(ITEMVAR L);
BEGIN "DPYL"
SAFE REAL ARRAY ITEMVAR VA,VB;
SET VSET;
VSET←$ ENDPT⊗L;
VA←LOP(VSET);
VB←COP(VSET);
AIVECT($ ∂(VA)[1]*MAGX+DXL,$ ∂(VA)[2]*MAGY+DYL);
AVECT($ ∂(VB)[1]*MAGX+DXL,$ ∂(VB)[2]*MAGY+DYL);
END "DPYL";

SUBR DISPLAY(ITEMVAR S);
BEGIN "DISPLAY"
ITEMVAR E;

DPYSET(DPYAA);
∀ E|$ VISIBLE⊗S≡E DO DPYL(E);
DPYOUT(APOG);

END "DISPLAY";

α	HIDEN,PREDICT;

SUBR HIDEN;
BEGIN "HIDEN"
SAFE REAL ARRAY ITEMVAR GPA,GPB;
REAL ITEMVAR GL;
INTEGER ELIST,E0,PVNUM,NVNUM,FLAG;
α ...CAMERA,SWINDO,OWINDO,DPY ALL CONTAIN THE ORIGINAL GETBLK PTRS;
	PROJECTOR(CAMERA,WORLD);
IF ¬RUN
THEN ⊂	TYPE "TEST?" EOM;
	IF INCHRW="Y"
	THEN EMARKALL(WORLD) ⊃;
FMARK(WORLD);
EMARK(WORLD);
OCCULT;
KLJOTS;

E0←ELIST←CLIPER(OWINDO,WORLD);
ELIST←ELIST LAND '777777;
WHILE ELIST≠0 DO
⊂ "VISIBLE"
	GL←$ NEW(0.0);
	$ MAKE VISIBLE⊗SCENE≡GL;
	PVNUM←PVT(ELIST);
	NVNUM←NVT(ELIST);
	GPA←CVSI(CVS(PVNUM), FLAG);
	IF FLAG
	THEN ⊂ GPA←$ NEW(SIZE7); NEW_PNAME(GPA,CVS(PVNUM)) ⊃;
	GPB←CVSI(CVS(NVNUM), FLAG);
	IF FLAG
	THEN ⊂ GPB←$ NEW(SIZE7); NEW_PNAME(GPB,CVS(NVNUM)) ⊃;
	$ ∂(GPA)[1]←XPP(PVT(ELIST))+LDX;
	$ ∂(GPA)[2]←YPP(PVT(ELIST))+LDY;
	$ ∂(GPB)[1]←XPP(NVT(ELIST))+LDX;
	$ ∂(GPB)[2]←YPP(NVT(ELIST))+LDY;
	$ MAKE ENDPT⊗GL≡GPA;
	$ MAKE ENDPT⊗GL≡GPB;
	ELIST←NBODY(ELIST) ⊃ "VISIBLE";
KLJUTS;
KLTEMP;
END "HIDEN";

MESSAGE PROCEDURE PREDICT;
BEGIN "PREDICT"
"H"	HECALL;
"B"	SETCAM;
	HIDEN;
β	DPYSTAT;
β	DISPLAY(SCENE);
	IF ¬RUN
	THEN BEGIN "DEBUG"
		DISKOUT;
		OUTSTR("PRE RESULTS - WAITING");
		INCHWL;
		END "DEBUG";
	END "PREDICT";

α	***	START OF EXECUTION	***;

IF ¬YES_PRED
THEN PUT_DATA(0,0,"PREDICTOR");
YES_PRED←TRUE;

PINIT;


TYPE "PREDICTOR (PRE) UP AND READY" EOM;

WHILE TRUE DO
IF RUN
THEN BEGIN "LOOP"
	TYPE "PRE - WAITING FOR MESSAGE" EOM;
	MESS1←GET_ENTRY('120,NULL,"PREDICTOR",NULL);
	MESS1←QUEUE('600,MESS1);
	ISSUE(1,"PREDICTOR","RECOGNIZER",MESSAGE CHECK(SCENE));
	END "LOOP"
ELSE BEGIN "TEST"
	IF ¬YES_REC
	THEN DISKIN;
	PREDICT;
	END "TEST";

END "PREDICTOR";

EOF.